#ifndef __UTILS_HPP__
#define __UTILS_HPP__

#include <sys/time.h>

#include <string>
#include <sstream>
#include <iomanip>

#include "mwc_generator.hpp"
#include "throw_on.hpp"
#include "logger_stream.hpp"
#include "assert.hpp"
#include "rand_generator.hpp"

//void log (const std::string& mensaje, const std::string& sep = ",", bool to_stderr = false, bool to_stdout = true){
//	std::ostringstream ss;

//	struct tm* timeinfo;
//	struct timeval utime;
//	char strTime[20];
//	
//	gettimeofday(&utime,NULL);
//	timeinfo = localtime((&utime.tv_sec));
//	strftime(strTime, 20,"%Y/%m/%d,%X", timeinfo);

//	// formato: yyyy/mm/dd,hh:mm:ss.uuuuuu,pid,mensaje\n
//	ss << strTime << "." << std::setfill('0') << std::setw(6) << utime.tv_usec << sep << getpid() << sep << mensaje << std::endl;

//	if (to_stderr)
//		fwrite(ss.str().c_str(),1,ss.str().size(),stderr);
//	if (to_stdout)
//		fwrite(ss.str().c_str(),1,ss.str().size(),stdout);
//}

//void log_on_throw (bool condition, const std::string& mensaje, const std::string& sep = ",", bool to_stderr = false, bool to_stdout = true) {
//	if (condition) {
//		log(mensaje,sep,to_stderr,to_stdout);
//		throw_on<std::runtime_error>(condition,mensaje);
//	}
//}

template <typename T>
T parse (const std::string& str, const T& def) {
	std::stringstream ss(str);
	T value;
	ss >> value;

	return (ss) ? value : def;
}

template <typename T>
T parse (const char* str, const T& def) {
	if (str != NULL)
		return parse<T>(std::string(str),def);
	else
		return parse<T>("",def);
}

template <typename T>
std::string parse(const T& value) {
	std::stringstream ss;
	ss << value;
	return ss.str();
}

template <typename T>
const char* c_parse(const T& value) {
	return parse(value).c_str();
}

template <>
std::string parse(const std::string& value) {
	return value;
}

#endif /* __UTILS_HPP__ */

